package cn.tedu.v4;

/**
 * Version 4 消息转发
 *  功能：一个客户端发送给服务器文本，转发至其他客户端
 *  客户端  多线程  ×
 *  服务器  多线程  √  只加一个多线程，替换 消息转发 方案
 *  ----------------------------------------------
 *  多线程并发安全问题
 *  当多线程并发操作统一个资源时，由于线程切换时间不确定【CPU时间片
 *  获取贤臣实际不确定】，可能导致代码执行混乱或者进入正确状态，程序
 *  出现错误，更严重情况软件瘫痪
 *
 *  synchronized  多线程关键字  同步锁
 *
 *  语法情景1：同步块方式
 *   语法：synchronized void method(){
 *
 *   }
 *   语法情景2：同步
 *   同步机制：可以控制线程的执行顺序，避免线程切换顺序  √
 *   异步机制：不控制线程执行顺序，执行两套功能顺序  ×
 *
 *案例：去WC
 *
 *
 */
public class Thread_syn {
    public static void main(String[] args) {
        //创建WC
        WC wc = new WC();
        //创建两个线程
        Thread p1 = new Thread(() -> {
            wc.go();
        });
        Thread p2 = new Thread(() -> {
            wc.go();
        });
        //统一启动
        p1.start();
        p2.start();

    }
}
    //创建WC
    class WC {
        public void go() {//去WC
            Thread t = Thread.currentThread();
            //获取线程实例：Thread[main,5,main]
            System.out.println(t.getName() + "去厕所...");
            try {//this 指代当前线程--哪条线程先被CPU时间片选中，先被执行
                synchronized (this) {//监视同步对象：先来线程，立即确定加锁
                    Thread.sleep(5000);
                    System.out.println(t.getName() + "找门进去...");
                }
                Thread.sleep(3000);
                System.out.println(t.getName() + "穿裤子走人...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }


